package com.springboot.jdk.nio;

import java.nio.ByteBuffer;

/**
 * Buffer Flip Demo案例实战
 *
 * @author: zr
 * @date: 2021-10-19
 */
public class BufferFlipDemo {

    public static void main(String[] args) {

        byte[] bytes = new byte[]{55, 56, 57, 58, 59};

        // 将java虚拟机内存里面的数据封装到Buffer 缓冲区里面去
        ByteBuffer wrap = ByteBuffer.allocateDirect(100);
        wrap.put(bytes);
        System.out.println("position:" + wrap.position());

        byte[] bytes2 = new byte[]{100, 101, 102};
        wrap.position(0);
        // 写完3条数据之后，position 会推进到3
        wrap.put(bytes2);

        // 此时如果执行flip， postition = 0, limit = 3
        wrap.flip();
        read(wrap);

        // 此时假如你想重复读取一次刚刚那3条数据
        // 重复读取一遍数据
        wrap.rewind();

        read(wrap);

        // 最后你想要完全还原掉，此时可以执行 clean
        wrap.clear();
        System.out.println("position:" + wrap.position());
        System.out.println("capacity:" + wrap.capacity());
        System.out.println("limit:" + wrap.limit());
    }

    private static void read(ByteBuffer wrap) {
        byte[] bytes3 = new byte[3];
        // 下面一行代码的意思就是从 position = 0 开始，读取5条数据放入到bytes3数组中，但是此时limit=3， 只能读取到3条数据
        wrap.get(bytes3);
        System.out.println("position:" + wrap.position());

        for (int i = 0; i < bytes3.length; i++) {
            System.out.println(bytes3[i]);
        }
    }
}
